package cn.cailin.day07.demo09Prop;

import java.io.*;
import java.util.Properties;
import java.util.Set;

/*
    java.util.Properties集合 extends Hashtable
    Properties 类表示了一个持久的属性集。Properties可以保存流或从流中加载。
    Properties集合是唯一一个和IO流相结合的集合
        可以使用Properties集合中的方法store，把集合中的临时数据，持久写入到硬盘中存储
        可以使用Properties集合中的方法load，可以把硬盘中保存的文件(键值对),读取到集合中使用

    属性列表中每个键及其对应值都是一个字符串。
        Properties集合是一个双列集合，key和value默认都是字符串
 */
public class Demo01Properties {
    public static void main(String[] args) throws IOException {
        show03();
    }
    /*
        可以使用Properties集合中的方法load，把硬盘中保存的文件（键值对），读取到集合中使用
        void load(InputStream inStream)
        void load(Reader reader)
        参数:
            InputStream inStream:字节输入流，不能读取含有中文的键值对
            Reader reader:字符输入流，读取含有中文的键值对
        使用步骤：
            1.创建Properties集合对象
            2.使用Properties集合对象中的方法load读取保存键值对的文件
            3.遍历Properties集合
        注意:
            1.存储键值对的文件中，键与值默认的链接符号可以使用=，空格（其他符号）
            2.存储键值对的文件中，可以使用#进行注释被注释的键值对不会在被读取
            3.存储键值对的文件中，键与值默认都是字符串，不再加引号

     */
    private static void show03() throws IOException {
        //1.创建Properties集合对象
        Properties prop=new Properties();
        //2.使用Properties集合对象中的方法load读取保存键值对的文件
        prop.load(new FileReader("D:\\IDEA\\day05-code\\src\\cn\\cailin\\day07\\prop.txt"));
        //3.遍历Properties集合
        Set<String> set=prop.stringPropertyNames();
        for (String key :
                set) {
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);

        }
    }

    /*
        可以使用Properties集合中的方法store,把集合中的临时数据，持久化写入到硬盘中存储
        void store(OutputStream out,String comments)
        void store(Writer writer,String comments)
        参数:
            OutputStream out:字节输出流，不能写入中文
            Writer writer:字符输出流，可以写中文
            String comments:注释，用来解释说明保存的文件是做什么用的
                            不能使用中文，会产生乱码，默认是Unicode编码
                            一般使用“”空字符串
        使用步骤:
            1.创建Properties集合对象，添加数据
            2.创建字节输出流/字符输出流，构造方法绑定要输出的目的地
            3。使用Properties集合中的方法store，把集合中临时的数据，持久化写入到硬盘当中存储
     */
    private static void show02() throws IOException {
        // 1.创建Properties集合对象，添加数据
        //创建Properties集合对象
        Properties prop=new Properties();
        //使用setProperty往集合中添加数据
        prop.setProperty("赵丽颖","168");
        prop.setProperty("迪丽热巴","168");

        //2.创建字节输出流/字符输出流，构造方法绑定要输出的目的地
        /*FileWriter fw=new FileWriter("D:\\IDEA\\day05-code\\src\\cn\\cailin\\day07\\prop.txt");

        //3.使用Properties集合中的方法store，把集合中临时的数据，持久化写入到硬盘当中存储
        prop.store(fw,"save date");

        //4.释放
        fw.close();*/

        prop.store(new FileOutputStream("D:\\\\IDEA\\\\day05-code\\\\src\\\\cn\\\\cailin\\\\day07\\\\prop.txt"),"");//乱码
        //\u8D75\u4E3D\u9896=168
        //\u8FEA\u4E3D\u70ED\u5DF4=168
    }

    /*
        使用Properties集合存储数据，遍历取出Properties集合中的数据
        Properties集合是一个双列集合，key和value默认都是字符串
        Properties集合有一些操作字符串的特有方法
            Object setProperty(String key,String value)调用Hashtable的方法put。
            String getProperty(String key)用指定的键在此属性列表中搜索属性。通过key找到value值，此方法相当于Map集合中的get(key)方法
            Set<String> stringPropertyNames()返回此属性列表中的键集，其中该键及其对应值是字符串，相当于Map集合的keySet方法
     */
    private static void show01() {
        //创建Properties集合对象
        Properties prop=new Properties();
        //使用setProperty往集合中添加数据
        prop.setProperty("赵丽颖","168");
        prop.setProperty("迪丽热巴","168");
        prop.setProperty("赵丽颖","168");
        prop.setProperty("赵丽颖","168");
        //prop.put(1,true);

        //使用stringPropertyName把Properties集合中的   键取出，存储到一个Set集合
        Set<String> set=prop.stringPropertyNames();

        //遍历Set集合，取出Properties集合的每一个键
        for (String s :
                set) {
            //使用getProperty方法通过key获取value
            String value= prop.getProperty(s);
            System.out.println(s+"="+value);//不打印重复字段
            //赵丽颖=168
            //迪丽热巴=168
        }

    }
}
